/*
  @Description:  只封装基本的增删查改,复杂的不予封装
*/
package core

import (
	"database/sql"
	"go-gdbc/core/maps"
	"log"
	"reflect"
)

/*

 */
type SqlTemplate struct {
	db  *sql.DB
	err error
}

/*
   根据主键查询
   @param db 数据库连接池
   @param resultMap 结果集映射
   @return error 错误信息
*/
func (st *SqlTemplate) SelectByPk(id interface{}, resultMap *maps.ResultMap) (interface{}, error) {

	return nil, nil
}

func (st *SqlTemplate) Insert(target *interface{}) (int, error) {

	return 0, nil
}

func (st *SqlTemplate) InsertBatch(targets ...interface{}) (int, error) {

	return 0, nil
}

func (st *SqlTemplate) Update(target *interface{}) (int, error) {

	return 0, nil
}

func (st *SqlTemplate) UpdateBatch(target *interface{}) (int, error) {

	return 0, nil
}

/*
  @Description:   执行insert/update/delete操作
  @param  db  数据库连接池
  @param  sql  带站位符的sql
  @param  params  sql参数
  @return  int  影响的行数
  @return  error 错误信息
*/
func ExecSql(db *sql.DB, sql string, params ...interface{}) (int, error) {

	return 0, nil
}

/*
  @Description:  执行查询操作
  @param  db 数据库连接池
  @param  resultType 结果类型
  @param  sql 带站位符的sql
  @param  params sql参数
  @return  interface{} 查询结果
  @return  error 错误信息
*/
func QuerySql(db *sql.DB, resultType reflect.Type, sql string, params ...interface{}) (interface{}, error) {

	stmt, err := db.Prepare(sql)
	if err != nil {
		panic(err)
	}

	defer stmt.Close()

	rows, err := stmt.Query(params)
	if nil != err {
		panic(err)
	}

	defer rows.Close()

	cts, _ := rows.ColumnTypes()
	for _, ct := range cts {
		log.Println(ct.DatabaseTypeName())
	}

	return 0, nil
}

/*
  @Description:  执行事务操作,会自动提交和回滚事务
  @param db 数据库连接池
  @param sqlOp
  @return interface{}
*/
func ExecTx(db *sql.DB, sqlOp func(*sql.DB) (interface{}, error)) (interface{}, error) {

	//开启事务
	tx, err := db.Begin()
	if nil != err {
		return 0, err
	}

	defer func() {
		if err := recover(); err != nil {
			//回滚事务
			tx.Rollback()
		} else {
			//提交事务
			tx.Commit()
		}

		db.Close()
	}()

	return sqlOp(db)
}
